package 多进程;

import java.io.*;

public class TestExec {
    /**
     * 标准输出stdout
     * 标准错误输出stderr
     *
     * 将标准输出信息写入到stdout.txt文件中
     * 将标准错误信息写入到stderr.txt文件中
     *
     */
    public static void main(String[] args) throws IOException {
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("javac");//当前这个不是一个完整的命令
        /**
         * 获取到子进程的标准输出和标准错误,把这里的内容写入到两个文件中
         * 获取标准输出,从这个文件对象中,就能把子进程的标准输出给读出来
         */
        try(FileOutputStream stdout = new FileOutputStream("stdout.txt")){
            try(InputStream inputStream = process.getInputStream()){
                while (true) {
                    int ch = inputStream.read();
                    if(ch == -1){
                        break;
                    }
                    stdout.write(ch);
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        /**
         * 获取子进程的标准错误输出,写入到stderr.txt文件中去
         */
        try(FileOutputStream stderr = new FileOutputStream("stderr.txt")){
            try(InputStream inputStream = process.getErrorStream()){
                while(true){
                    int ch = inputStream.read();
                    if(ch == -1){
                        break;
                    }
                    stderr.write(ch);
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        /**
         * 测试一下,对src/Exec进行编译
         */

    }
    public static void main1(String[] args) throws IOException {
        //每个Java应用程序都有一个Runtime类的Runtime,允许应用程序与运行应用程序的环境进行接口
        //当前运行时可以从getRuntime方法获得
        //Runtime在JVM中是一个单例
        Runtime runtime = Runtime.getRuntime();//返回与当前Java应用程序关联的运行时对象.Runtime类的大多数方法都是实例方法，必须针对当前的运行时对象进行调用。
        //Process表示"进程"
        Process process = runtime.exec("javac");
        //当执行这个代码,就相当于在cmd中输入了一个对应的指令
        //输入的命令,其实操作系统会去一些特定的目录中找,看看是否存在这个对应的可执行文件
        //如果javac在cmd中错误,则需要配置环境变量(这个一般在我们安装jdk的时候就配置好了的)

        //javac是一个控制台程序,他的输出,是输出到"标准输出"和"标准错误"这两个特殊的文件中的.
        //要想看到这个程序的运行效果,就得获取到标准输出和标准错误的内容

        //下面的两个命令是系统自带的
        Process process1 = runtime.exec("notepad");//记事本
        Process process2 = runtime.exec("calc");//计算器

    }
}
